# # 生成器生成数列：
# def create_fbnq(n):
#     a,b=0,1
#     i=0
#     while i<n:
#         yield b
#         a,b=b,a+b
#         i+=1
# for x in  create_fbnq(20):
#         print(x)

# 递归生成数列：
def Fab(n):
    if n==0 or n==1:
        return 1
    # 递归：函数的自身调用
    return Fab(n-1) + Fab(n-2)
for x in range(10):
    print(Fab(x),end=" ")



 # 问题描述：
#
# 斐波那契数列如下：
# F(0) = 0, F(1) = 1
# F(n) = F(n-1) + F(n-2)
#
# 编写一个计算斐波那契数列的函数，采用递归方式，输出不超过n的所有斐波那契数列元素
# 调用上述函数，完成如下功能：
# 用户输入一个整数n，输出所有不超过n的斐波那契数列元素、输出数列的元素和及平均数，
#
# 输出按照顺序，用英文逗号和空格分割
#
# 例如：
#
# 输入： 5
#
# 输出： 0， 1， 1， 2， 3， 5， 12， 2

def fibo(number):
    if number == 0:
        return 0
    elif number == 1:
        return 1
    else:
        fiboValue = fibo(number - 1) + fibo(number - 2)
        return fiboValue

def fiboListFun(num):
    temp = 0
    while True:
        fiboVal = fibo(temp)
        if fiboVal > num:
            break
        fiboList.append(fiboVal)
        temp = temp + 1


num = eval(input('请输入数字:'))
fiboList = []
fiboListFun(num)
# 求和
fiboSum = sum(fiboList)
# 求均值
fiboAvg = fiboSum // len(fiboList)
# 把sum、avg加入fiboList然后输出
fiboList.append(fiboSum)
fiboList.append(fiboAvg)

# 此时输出的是列表，如输入5，输出[0,1,1,2,3,5,12,2],
# 要求的输出:1.没有方括号 2.使用逗号和空格作为分割，而这个只有逗号
# print(fiboList)

for i in range(len(fiboList) - 1):
    print(fiboList[i], end=', ')
print(fiboList[-1])



# 二、
#斐波那契第递归第n项
# def fact(n):
#     if n<=1:
#         return 1
#     else:
#         return n * fact(n-1)#fact(n)代表自身
# test=fact(5)#这里相当于fact(3)=3*fact(2)=3*2*fact(1)=3*2*1
# print(test)

# def fact(n):
#     if n<=2:
#         return 1
#     else:
#         return fact(n-1)+fact(n-2)
# test=fact(34)
# print(test)



# 三、
#斐波那契数列实现
nterms = int(input("你需要几项:"))

# 第一和第二项
n1 = 0
n2 = 1
count = 2

# 判断输入的值是否合法
if nterms <= 0:
    print("请输入一个正整数。")
elif nterms == 1:
    print("斐波那契数列：")
    print(n1)
else:
    print("斐波那契数列：")
    print(n1, ",", n2, end=" , ")
    while count < nterms:
        nth = n1 + n2
        print(nth, end=" , ")
        # 更新值
        n1 = n2
        n2 = nth
        count += 1



# 四、生成器写斐波那契
def fib(n):
    a = 0
    b = 1
    while n > 0:
        a, b = b, a + b
        n -= 1
        yield b


f = fib(10)
for i in f:
    print(i)

print(next(fib(10)))